#include "helper/sqlite/detail/DB.h"
#include <cassert>
#include <sqlite3.h>
#include "Statement.h" //detail::Statement 

namespace helper {
namespace sqlite {
namespace detail {

DB::DB(const std::string & url)
: _url(url)
, _db(nullptr)
{
}
DB::~DB(){
}
int DB::open(){
  return sqlite3_open_v2(_url.c_str(),  &_db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr);
}
int DB::close(){
  assert(_db != nullptr); 
  return sqlite3_close_v2(_db);
}

std::pair<int, Statement *>  DB::prepare(const std::string & sql) {
  assert(_db != nullptr); 
  sqlite3_stmt * stmt = nullptr;
  int ec = sqlite3_prepare_v2(_db, sql.c_str(), sql.length(), &stmt, nullptr);
  return std::make_pair(ec, ec != 0 ? nullptr : new Statement(stmt));
}
int64_t DB::changes() const{
  assert(_db != nullptr); 
  return sqlite3_changes64(_db);
}

int DB::errorCode(){
  assert(_db != nullptr); 
  return sqlite3_errcode(_db);
}
const char * DB::errorMessage(){
  assert(_db != nullptr); 
  return sqlite3_errmsg(_db);
}

int64_t DB::lastInsertRowID(){
  assert(_db != nullptr); 
  return sqlite3_last_insert_rowid(_db);
}
void DB::lastInsertRowID(int64_t rowid){
  assert(_db != nullptr); 
  sqlite3_set_last_insert_rowid(_db, rowid);
}

const char * DB::errorString(int errorCode) {
  return sqlite3_errstr(errorCode);
}

void * DB::raw() const{
  assert(_db != nullptr); 
  return _db;
}

}//namespace detail
}//namespace sqlite
}//namespace helper
